package database;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

import beans.Paragraphe;

/**
 * Interface des méthodes d'interaction avec la base de donnée
 * @author Benjamin Gouit
 */
public interface AppUtilInterface {

	// Méthodes associées à la table Termes
	/**
	 * Retourne le nombre de ligne dans la table Termes
	 * @return nombre de ligne dans la table Termes
	 * @throws Exception
	 */
	public int getNbLigneTermes() throws Exception;
	
	/**
	 * Insert tous les termes du set dans la table Termes
	 * @param termes : liste des termes à inserer
	 * @throws Exception
	 */
	public void insertTermes (Set<String> termes) throws Exception;
	
	/**
	 * Retourne l'identifiant du terme identifié par son nom
	 * @param terme : nom du terme à chercher
	 * @return identifiant du terme recherché
	 * @throws Exception
	 */
	public int getIdterme (String terme) throws Exception;
	
	/**
	 * Met à jour l'idf du terme identifié par son identifiant
	 * @param idTerme : identifiant du terme à modifier
	 * @param idf : idf du terme
	 * @throws Exception
	 */
	public void setIdfTerme (int idTerme, double idf) throws Exception;
	
	/**
	 * Met à jour tous les idf des termes de la table Termes
	 * @throws Exception
	 */
	public void setIdfTermes () throws Exception;
	
	/**
	 * Retourne le nombre de paragraphe contenant le terme identifié par son identifiant
	 * @param idTerme : identifiant du terme cherché
	 * @return nombre de paragraphe où le terme apparait
	 * @throws Exception
	 */
	public double getNbParagraphePourTerme(int idTerme) throws Exception;
	
	/**
	 * Valide l'existence d'un terme identifié par son nom dans la table Termes
	 * @param terme : nom du terme cherché
	 * @return vrai (true) si le terme existe dans la table Termes ou faux (false) sinon
	 * @throws Exception
	 */
	public boolean termeExists(String terme) throws Exception;


	// Méthodes associées à la table Paragraphes
	/**
	 * Retourne le nombre de ligne de la table Paragraphes 
	 * @return nombre de ligne de la table Paragraphes
	 * @throws Exception
	 */
	public int getNbLigneParagraphes() throws Exception;
	
	/**
	 * Insert tous les paragraphes de la liste (le chemin de son document, son chemin xml
	 * et sa longueur) dans la table Paragraphes
	 * @param filepath : filepath du paragraphe à inserer
	 * @param xpath : xpath du paragraphe à inserer
	 * @param longueur : longueur du paragraphe à inserer
	 * @throws Exception
	 */
	public void insertParagraphes (ArrayList<Paragraphe> paragraphes) throws Exception;
	
	/**
	 * Retourne l'identifiant du paragraphe identifié par le chemin de son document
	 * et son chemin xml dans la table Paragraphes
	 * @param filepath : filepath du paragraphe à chercher
	 * @param xpath : xpath du paragraphe à chercher
	 * @return identifiant du paragraphe cherché
	 * @throws Exception
	 */
	public int getIdParagraphe (String filepath, String xpath) throws Exception;
	
	/**
	 * Retourne la longueur moyenne de tous les paragraphes de la table Paragraphes
	 * @return longueur moyenne des paragraphes
	 * @throws Exception
	 */
	public double getLongueurMoyParagraphes() throws Exception;
	
	/**
	 * Retourne le chemin du document et le chemin xml du paragraphe identifié par
	 * son identifiant dans la table Paragraphes
	 * @param idParagraphe : identifiant du paragraphe concerné
	 * @return tableau de 2 String [filepath du paragraphe, xpath du paragraphe]
	 * @throws Exception
	 */
	public String[] getParagraphePaths(int idParagraphe) throws Exception;

	// Méthodes associées à la table ApparaitDans
	/**
	 * Retourne le nombre de ligne de la table ApparaitDans
	 * @return nombre de ligne de la table ApparaitDans
	 * @throws Exception
	 */
	public int getNbLigneApparaitDans() throws Exception;
	
	/**
	 * Insert dans la table ApparaitDans toutes les associations terme-paragraphe
	 * (l'identifiant du terme, l'identifiant du paragraphe et la fréquence
	 * d'apparition du terme dans le paragraphe) contenu dans le paragraphe donné 
	 * @param paragraphe : paragraphe contenant la liste des associations terme-paragraphe
	 * @throws Exception
	 */
	public void insertApparaitDans (Paragraphe paragraphe) throws Exception;

	/**
	 * Met à jour le tf du couple terme-paragraphe identifié par l'identifiant de la ligne
	 * dans la table ApparaitDans
	 * @param idApparaitDans : identifiant du couple terme-paragraphe concerné
	 * @param tf : tf à rajouter
	 * @throws Exception
	 */
	public void setTfApparaitDans (int idApparaitDans, double tf) throws Exception;
	
	/**
	 * Met à jour tous les tf des couples terme-paragraphe identifiés par l'identifiant
	 * de la ligne contenus dans la HashMap dans la table ApparaitDans
	 * @param tfHashmap : HashMap contenant la liste de couples <identifiant de la ligne
	 * 		à modifier, tf à rajouter>
	 * @throws Exception
	 */
	public void setTfApparaitDans (HashMap<Integer, Double> tfHashmap) throws Exception;
	
	/**
	 * Retourne la fréquence du terme dans le paragraphe et la longueur de ce paragraphe
	 * associé au couple terme-paragraphe identifié par l'identifiant de la ligne dans
	 * la table ApparaitDans
	 * @param idApparaitDans : identifiant de la ligne dans la table ApparaitDans
	 * @return tableau de 2 doubles [fréquence du couple terme-paragraphe de la ligne, longueur du paragraphe associé]
	 * @throws Exception
	 */
	public double[] getFreqEtLongueur(int idApparaitDans) throws Exception;


	// Méthodes associées à la table APourPosition
	/**
	 * Insert dans la table APourPosition la liste des positions du terme dans le paragraphe
	 * de tous les couples terme-paragraphe associés à ce paragraphe
	 * @param paragraphe : paragraphe contenant la liste des associations terme-paragraphe,
	 * 		ainsi que les positions des termes dans ce paragraphes associées
	 * @throws Exception
	 */
	public void insertAPourPosition (Paragraphe paragraphe) throws Exception;

	//Méthodes associées à plusieurs tables
	/**
	 * Retourne le poids (tf x idf) du terme identifié par son nom associé au paragraphe
	 * identifié par son identifiant
	 * @param idParagraphe : identifiant du paragraphe concerné
	 * @param terme : terme concerné
	 * @return la multiplication du tf (table ApparaitDans) et de l'idf (table Termes) concernés,
	 * 		0.0 si le couple Paragraphe-Terme n'existe pas
	 * @throws Exception
	 */
	public double getTfIdf(int idParagraphe, String terme) throws Exception;
	
 
	/**
	 * Retourne un boolean indiquant si deux termes donnés se suivent dans un paragraphe donné 
	 * @param idParagraphe: l'identifiant du paragraphe
	 * @param terme1: le 1er terme
	 * @param term2: le 2nd terme
	 * @return true si terme1 et terme2 se suivent terme1 terme2 dans un paragraphe
	 * 		   false sinon 	
	 */
	public boolean isFollowed(int idParagraphe, String terme1, String terme2) throws Exception;
}
